package com.yjy.util;

import com.yjy.controller.vo1.UserVo;
import com.yjy.controller.vo3.PersonVo;
import com.yjy.controller.vo4.UserVo4;
import org.springframework.util.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

/**
 * 校验工具类（手动）
 */
public class ValidatorUtil {

    /**
     * 正则表达式:验证用户名(不包含中文和特殊字符)如果用户名使用手机号码或邮箱 则结合手机号验证和邮箱验证
     */
    public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,17}$";

    /**
     * 正则表达式:验证密码(不包含特殊字符)
     * “^$|”为空时不校验，看是否有必要去掉
     */
    public static final String REGEX_PASSWORD = "^$|^[a-zA-Z0-9]{6,16}$";

    /**
     *说明：移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
     * 联通：130、131、132、152、155、156、185、186
     * 电信：133、153、180、189
     * 总结起来就是第一位必定为1，第二位必定为3或5或8，其他位置的可以为0-9
     * 验证号码 手机号 固话均可
     * 正则表达式:验证手机号
     */
    public static final String REGEX_MOBILE = "((^(13|15|18)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";

    /**
     * 正则表达式:验证邮箱
     */
    public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

    /**
     * 正则表达式:验证汉字(1-9个汉字)  {1,9} 自定义区间
     */
    public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5]{1,9}$";

    /**
     * 正则表达式:验证身份证
     */
    public static final String REGEX_ID_CARD = "(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])";

    /**
     * 正则表达式:验证URL
     */
    public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";

    /**
     * 正则表达式:验证IP地址
     */
    public static final String REGEX_IP_ADDR = "(2[5][0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})";


    public static final String REGEX_DATE_FORMAT = "^\\d{4}-\\d{1,2}-\\d{1,2}";


    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    public static <T> String validateEntity(T obj) {
        StringBuilder stringBuilder = new StringBuilder();
        Set<ConstraintViolation<T>> set = validator.validate(obj);
        if (!CollectionUtils.isEmpty(set)) {
            for (ConstraintViolation<T> cv : set) {
                stringBuilder.append(cv.getPropertyPath()).append(cv.getMessage()).append("，");
            }
        }

        return stringBuilder.length() == 0 ? "" : stringBuilder.deleteCharAt(stringBuilder.length() - 1).toString();
    }

    // 测试
    public static void main(String[] args) {
//        // 测试1
//        UserVo userVo1 = new UserVo();
//        System.out.println("userVo1校验：" + ValidatorUtil.validateEntity(userVo1));
//
//        // 测试2
//        UserVo userVo2 = new UserVo();
//        userVo2.setAdress(new UserVo.Adress() {{
//            setName("11");
//        }});
//        System.out.println("userVo2校验：" + ValidatorUtil.validateEntity(userVo2));
//
//        // 测试3
//        UserVo userVo3 = new UserVo();
//        userVo3.setName("axxs");
//        userVo3.setMobilePhone("1234566");
//        userVo3.setAdress(new UserVo.Adress() {{
//            setName("123");
//        }});
//        System.out.println("userVo3校验：" + ValidatorUtil.validateEntity(userVo3));

//        // 测试4
//        PersonVo personVo = new PersonVo() {{
//            setUsername("sss#xx");
//            setPassword("");
//            setPhone("1310000111");
//            setEmail1("111@@@@qq.com");
//            setEmail2("@@@@qq.com");
//            setIdentityNumber("990481199504032011");
//        }};
//        System.out.println("personVo校验：" + ValidatorUtil.validateEntity(personVo));

        // 测试5：自定义日期有效性校验
        System.out.println("UserVo4校验：" + ValidatorUtil.validateEntity(new UserVo4()));

        System.out.println("UserVo4校验：" + ValidatorUtil.validateEntity(new UserVo4() {{
            setBrithday("202102-20");
        }}));

        System.out.println("UserVo4校验：" + ValidatorUtil.validateEntity(new UserVo4() {{
            setBrithday("2021-02-30");
        }}));
    }
}
